package org.lanqiao.tjut.practice;

import java.util.Scanner;

import org.junit.Test;

public class Practice16to30 {
	// 【程序16】
	// 题目：输出9*9口诀。
	@Test
	public void test16() {
		// 外层for循环代表乘号左边的数 由1到9
		for (int i = 1; i <= 9; i++) {
			// 内层for循环表示每行乘号右边的数 由1到i
			for (int j = 1; j <= i; j++) {
				// 每个乘式的乘积表示出来
				int k = i * j;
				// 输出每行的乘法口诀，每行的输出不要换行
				System.out.print(j + "*" + i + "=" + k);
				// 每行每输出一个乘式，就输一个空格，保证乘法口诀的形式
				System.out.print("  ");
			}
			// 输出每行的全部乘式后再换行
			System.out.println();
		}
	}

	// 【程序17】
	// 题目：猴子吃桃问题：猴子第一天摘下若干个桃子，当即吃了一半，还不过瘾，又多吃了一个
	// 第二天早上又将剩下的桃子吃掉一半，又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。
	// 到第10天早上想再吃时，见只剩下一个桃子了。求第一天共摘了多少。
	@Test
	public void test17() {
		// 第10天剩下一个桃子
		int n = 1;
		// 一共吃了九天循环九次，由第10天剩下一个桃子逆推前一天剩余的桃子，直到第一天。
		for (int i = 9; i > 0; i--) {
			// 前一天的桃子数量总是今天桃子数量加1乘2
			n = (n + 1) * 2;
		}
		// 输出结果
		System.out.println("猴哥第一天共摘了" + n + "个桃子。");
	}

	// 【程序18】
	// 题目：两个乒乓球队进行比赛，各出三人。甲队为a,b,c三人，乙队为x,y,z三人。
	// 已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比，c说他不和x,z比，
	// 请编程序找出三队赛手的名单。
	@Test
	public void test18() {

	}

	// 【程序19】
	// 题目：打印出图案（菱形）
	@Test
	public void test19() {
		// 两个大for循环
		// 第一个大外层for循环，打印前四行（正等腰三角形）
		for (int i = 1; i <= 4; i++) {
			// 打印每行的空格
			for (int j = 0; j < 4 - i; j++) {
				System.out.print(" ");
			}
			// 打印每行星号
			for (int k = 0; k < i * 2 - 1; k++) {
				// 每打印完一行后换行
				System.out.print("*");
			}
			System.out.println();
		}
		// 第二个大外层for循环，打印后三行（倒等腰三角形）
		for (int m = 0; m < 3; m++) {
			// 打印每行的空格
			for (int n = 0; n <= m; n++) {
				System.out.print(" ");
			}
			// 打印每行的星号
			for (int z = 0; z < 6 - 2 * m - 1; z++) {
				System.out.print("*");
			}
			// 每打印完一行后换行
			System.out.println();
		}
	}

	// 【程序20】
	// 题目：有一分数序列：2/1，3/2，5/3，8/5，13/8，21/13...求出这个数列的前20项之和。
	@Test
	public void test20() {
		// 先定义一个变量表示分子，初始为2
		int a = 2;
		// 定义一个变量表示分母，初始为1
		int b = 1;
		// 表示前20项的和
		float sum = 0;
		// for循环表示循环数列的前20项
		for (int i = 0; i < 20; i++) {
			// (float)a/b表示数列的每个值，每循环一次，sum就加一次数列值
			sum = sum + (float) a / b;
			// 先将分母赋值给一个中间值
			int temp = b;
			// 将a的值赋值给b，后一项数列值的分母是前一项的分子
			b = a;
			// 后一项数列的分子为前一项分子和分母的和
			a = a + temp;
		}
		// 输出结果
		System.out.println("数列前20项的和为：" + sum);
	}

	// 【程序21】
	// 题目：求1+2!+3!+...+20!的和
	@Test
	public void test21() {
		// 表示数列的和，初始为0
		long sum = 0;
		// 外层for循环表示共有20项，循环20次
		for (int i = 1; i <= 20; i++) {
			// 定义变量为每项阶乘的乘积，初始值为1，不影响乘积
			long pro = 1;
			// 内层for循换求每项的阶乘，i是几就从几开始乘，直到乘到1为止。
			for (int j = i; j >= 1; j--) {
				pro = pro * j;
			}
			// 每计算完一项阶乘的值， 和sum就加一次
			sum = sum + pro;
		}
		System.out.println("1+2!+3!+...+20!的和为：" + sum);
	}

	// 【程序22】
	// 题目：利用递归方法求5!
	@Test
	public void test22() {
		// 从控制台输入想要求的某个数的阶乘
		Scanner input = new Scanner(System.in);
		System.out.println("你想求哪个数的阶乘：");
		int n = input.nextInt();
		// 调用求阶乘的方法，并将返回值设为iNum
		long iNum = iRide(n);
		// 输出结果
		System.out.println(n + "!=" + iNum);
	}

	/**
	 * 用递归方法就阶乘
	 * 
	 * @param n
	 *            n的阶乘
	 * @return n的阶乘的值
	 */
	public long iRide(int n) {
		// 递归结束条件，一旦满足，就结束递归
		if (n == 1) {
			return n;
		}
		// 递归求阶乘
		return n * iRide(n - 1);
	}

	// 【程序23】
	// 题目：有5个人坐在一起，问第五个人多少岁？他说比第4个人大2岁。
	// 问第4个人岁数，他说比第3个人大2岁。
	// 问第三个人，又说比第2人大2岁。
	// 问第2个人，说比第一个人大2岁。
	// 最后问第一个人，他说是10岁。请问第五个人多大？
	@Test
	public void test23() {
		// 定义变量为第一个人的年龄
		int n = 10;
		// for循环表示循环到五个人
		for (int i = 1; i < 5; i++) {
			// 每个人都说比前一个人大两岁
			n = n + 2;
		}
		System.out.println("第五个人的年龄为：" + n + "岁");
	}

	// 【程序24】
	// 题目：给出一个不多于5位的正整数，要求：一、求它是几位数，二、逆序打印出各位数字。
	

}
